#!/bin/bash

# 输出文件路径
OUTPUT_FILE="/var/log/system_monitor.log"

# 创建/清空输出文件
> $OUTPUT_FILE

# 获取 CPU 核心数量
NUM_CPUS=$(grep -c ^processor /proc/cpuinfo)

# 获取 CPU 占用率
function get_cpu_usage() {
    # 使用 `mpstat` 工具获取所有 CPU 的占用率
    CPU_USAGE=$(mpstat 1 1 | awk '/^Average:/ {print 100 - $NF}')
    echo "CPU Usage: ${CPU_USAGE}%"
}

# 获取内存使用情况
function get_memory_usage() {
    # 使用 `free` 命令获取内存使用情况
    MEM_INFO=$(free -m | awk '/Mem:/ {print $3 "MB used, " $4 "MB free"}')
    echo "Memory Usage: ${MEM_INFO}"
}

# 获取 IO 使用情况
function get_io_usage() {
    # 使用 `iostat` 获取 IO 使用率
    IO_INFO=$(iostat -dx 1 1 | awk '/^Device:/ {getline; print $1 " IO Utilization: " $NF"%"}')
    echo "IO Usage: ${IO_INFO}"
}

# 获取单核 CPU 占用率
function get_per_cpu_usage() {
    # 使用 `mpstat` 工具获取每个 CPU 核心的占用率
    PER_CPU_USAGE=$(mpstat -P ALL 1 1 | awk '/^Average:/ && $2 ~ /[0-9]+/ {print "CPU" $2 ": " 100 - $NF "%"}')
    echo "Per CPU Usage:"
    echo "$PER_CPU_USAGE"
}

# 获取 CPU 占用率最高的前 10 个进程
function get_top_10_cpu_processes() {
    # 使用 `ps` 命令按 CPU 占用率排序，列出前10个进程
    TOP_PROCESSES=$(ps -eo pid,user,comm,%cpu,%mem --sort=-%cpu | head -n 11)
    echo "Top 10 CPU-consuming processes:"
    echo "$TOP_PROCESSES"
}

# 获取指定目录的磁盘空间使用情况
function get_disk_usage() {
    # 使用 `df` 命令获取指定目录的磁盘使用情况
    DISK_USAGE=$(df -h /opt | awk 'NR==2 {print "Disk Usage on /opt: " $3 " used, " $4 " free, " $5 " utilized"}')
    echo "$DISK_USAGE"
}

# 循环每3秒钟采集一次数据
while true; do
    # 获取当前时间
    echo "-----------------------------------------" >> $OUTPUT_FILE
    echo "Timestamp: $(date)" >> $OUTPUT_FILE
    echo "-----------------------------------------" >> $OUTPUT_FILE

    # 获取并输出 CPU 占用率
    echo "$(get_cpu_usage)" >> $OUTPUT_FILE

    # 获取并输出内存使用情况
    echo "$(get_memory_usage)" >> $OUTPUT_FILE

    # 获取并输出 IO 使用情况
    echo "$(get_io_usage)" >> $OUTPUT_FILE

    # 获取并输出每个核心的 CPU 占用率
    echo "$(get_per_cpu_usage)" >> $OUTPUT_FILE

    # 获取并输出 CPU 占用率最高的前10个进程
    echo "$(get_top_10_cpu_processes)" >> $OUTPUT_FILE

    # 获取并输出指定目录的磁盘空间使用情况
    echo "$(get_disk_usage)" >> $OUTPUT_FILE

    # 等待3秒钟再执行下一次采集
    sleep 3
done

